import time

import pytest

from config.setting import is_dd_msg
from utils.logging_tool.recordlog import logs
from utils.notice.dingRobot import send_dd_msg
from utils.read_files_tools.remove_file import remove_file


@pytest.fixture(scope="session", autouse=True)
def clear_file():
    # 清除测试生成的文件
    remove_file("./report/temp", ['json', 'txt', 'attach', 'properties'])
    remove_file("./data/download", ['pdf', '7z', 'zip'])


@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    """
     在每个测试用例运行结束后调用，自定义测试报告,当执行一个用例的时候会自动的调用这个方法
    :param item: 测试用例对象
    :param call:  用例测试步骤
    :return:
    """

    out = yield
    report = out.get_result()

    if report.when == "call":
        # 测试时间，保留小数点后3位
        duration = float(format(report.duration, '.3f'))
        logs.info(f"""
        用例执行测试报告信息如下：
            用例ID  ：{report.nodeid}
            测试步骤：{report.when}
            测试结果：{report.outcome}
            报错信息：{report.longrepr}
            异常信息：{call.excinfo}
            执行时间：{duration}s """)


# 生成测试结果摘要字符串
def pytest_terminal_summary(terminalreporter, exitstatus, config):
    """ 获取测试结果统计信息，并发送到钉钉 """

    # 获取结果统计信息
    stats = terminalreporter.stats

    # 输出测试执行的详细统计信息
    total = terminalreporter._numcollected
    passed = len(stats.get('passed', []))
    failed = len(stats.get('failed', []))
    error = len(stats.get('error', []))
    skipped = len(stats.get('skipped', []))
    duration = float(format((time.time() - terminalreporter._sessionstarttime), '.2f'))  # 执行总时长
    hour = int(duration // 3600)
    minute = int(duration % 3600 // 60)
    seconds = duration % 3600 % 60
    execute_duration = f'{hour} 时 {minute} 分 {seconds} 秒'

    try:
        # 用例通过率
        rate = round((passed / total * 100), 2)
    except ZeroDivisionError:
        rate = '0.00'

    summary = f"""
    各位同事, 大家好:
        xxx 系统 web自动化测试执行完成，结果如下:
        用例运行总数 ：{total} 个
        通过用例个数 ：{passed} 个
        失败用例个数 ：{failed} 个
        异常用例个数 ：{error} 个
        跳过用例个数 ：{skipped} 个
        测试通过率   ：{rate} %
        测试总耗时   ：{execute_duration}
        """
    print(summary)
    if is_dd_msg:
        send_dd_msg(summary)
